package gui;

public class ChecaTipoDeClasse 
{
	/**
	 * esse metodo serve para indicar se uma classe(no caso, um atributo de um metodo) eh de
	 * um tipo primitivo e, portanto, o usuario pode diggita-la em seu teclado(String eh inclusa nesse tipo).
	 * tipos primitivos considerados: String, int, float, log, boolean, byte, short, double, char
	 * @param classe classe(como adquirimos um atributo de um metodo) que desejamos saber se e do tipo primario
	 * @return 
	 */
	public static boolean classeEhTipoPrimitivo(@SuppressWarnings("rawtypes") Class classe)
	{
		String nomeClasse = classe.getName();
		//System.out.println("nome:" + nomeClasse);
		
		if(nomeClasse.compareTo("java.lang.String") == 0 || nomeClasse.compareTo("int") == 0 ||
		   nomeClasse.compareTo("float") == 0 || nomeClasse.compareTo("long") == 0 ||
		   nomeClasse.compareTo("boolean") == 0 || nomeClasse.compareTo("byte") == 0 ||
		   nomeClasse.compareTo("short") == 0 || nomeClasse.compareTo("double") == 0 ||
		   nomeClasse.compareTo("char") == 0 || nomeClasse.compareTo("java.lang.Integer") == 0 ||
		   nomeClasse.compareTo("java.lang.Boolean") == 0 || nomeClasse.compareTo("java.lang.Float") == 0 ||
		   nomeClasse.compareTo("java.lang.Long") == 0 || nomeClasse.compareTo("java.lang.Byte") == 0 ||
		   nomeClasse.compareTo("java.lang.Short") == 0 || nomeClasse.compareTo("java.lang.Double") == 0 ||
		   nomeClasse.compareTo("java.lang.Character") == 0)
		
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	/**
	 * esse metodo serve para indicar se uma classe(no caso, um atributo de um metodo) eh um
	 * array ou similar a array(LinkedList, PriorityQueue... classes que guardam referencias a outros objetos)
	 * @param classe classe(no caso, um atributo de um metodo) que deseja saber se eh um array ou similar de array
	 * @return
	 */
	public static boolean classeEhArrayOuSimilares(@SuppressWarnings("rawtypes") Class classe)
	{
	
		String nomeClasse = classe.getName();
		if(nomeClasse.compareTo("java.util.HashSet") == 0 || nomeClasse.compareTo("java.util.TreeSet") == 0 ||
		   nomeClasse.compareTo("java.util.LinkedHashSet") == 0 || nomeClasse.compareTo("java.util.ArrayList") == 0 ||
		   nomeClasse.compareTo("java.util.LinkedList") == 0 ||  nomeClasse.compareTo("java.util.ArrayDeque") == 0 ||
		   nomeClasse.compareTo("java.util.PriorityQueue") == 0 || classe.isArray())
		{
			return true;
		}
		else
		{
			return false;
		}	
	}
	
	/**
	 * esse metodo serve para indicar se uma classe(no caso, um atributo de um metodo) eh um
	 * array ou similar a array(LinkedList, PriorityQueue... classes que guardam referencias a outros objetos) que
	 * guarda tipos primitivos(inteiros, floats, Strings, bytes).
	 * @param classe classe(no caso, um atributo de um metodo) que deseja saber se eh um array ou similar de array que guarda tipos primitivos
	 * @return
	 */
	public static boolean classeEhArrayOuSimilaresQueGuardaTiposPrimitivos(@SuppressWarnings("rawtypes") Class classe)
	{
		boolean classeEhArrayOuSimilares = ChecaTipoDeClasse.classeEhArrayOuSimilares(classe);
		if(classeEhArrayOuSimilares == true)
		{
			@SuppressWarnings("rawtypes")
			Class classeComponenteArray = classe.getComponentType();
			if(ChecaTipoDeClasse.classeEhTipoPrimitivo(classeComponenteArray) == true)
			{
				return true;
			}
		}
		
		return false;
	}
	
	/**
	 * esse metodo serve para indicar se uma classe(no caso, um atributo de um metodo) eh um
	 * hashmap, um treemap ou um LinkedHashMap
	 * @param classe classe(no caso, um atributo de um metodo) que deseja saber se eh um hashmap
	 * @return
	 */
	public static boolean classeEhHashMap(@SuppressWarnings("rawtypes") Class classe)
	{
		
		String nomeClasse = classe.getName();
		if(nomeClasse.compareTo("java.util.HashMap") == 0 || nomeClasse.compareTo("java.util.TreeMap") == 0 ||
				   nomeClasse.compareTo("java.util.LinkedHashMap") == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean classeEhString(Class classe)
	{
		String nomeClasse = classe.getName();
		if(nomeClasse.compareTo("java.lang.String") == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean  classeEhArrayString(Class classe)
	{
		Class tipoDoArray = classe.getComponentType();
		if(tipoDoArray != null)
		{
			//eh array mesmo!!
			if (String.class.isAssignableFrom(tipoDoArray) || java.lang.String.class.isAssignableFrom(tipoDoArray)) {
	            return true;
	        }
		}
		
		return false;
	}
	
	
	@SuppressWarnings("rawtypes")
	public static boolean classeEhInteiro(Class classe)
	{
		String nomeClasse = classe.getName();
		if(nomeClasse.compareTo("int") == 0 || nomeClasse.compareTo("java.lang.Integer") == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean  classeEhArrayInteiro(Class classe)
	{
		Class tipoDoArray = classe.getComponentType();
		if(tipoDoArray != null)
		{
			//eh array mesmo!!
			if (int.class.isAssignableFrom(tipoDoArray)) {
	            return true;
	        }
		}
		
		return false;
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean classeEhFloat(Class classe)
	{
		String nomeClasse = classe.getName();
		if(nomeClasse.compareTo("float") == 0 || nomeClasse.compareTo("java.lang.Float") == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean  classeEhArrayFloat(Class classe)
	{
		Class tipoDoArray = classe.getComponentType();
		if(tipoDoArray != null)
		{
			//eh array mesmo!!
			if (float.class.isAssignableFrom(tipoDoArray)) {
	            return true;
	        }
		}
		
		return false;
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean classeEhLong(Class classe)
	{
		String nomeClasse = classe.getName();
		if(nomeClasse.compareTo("long") == 0 || nomeClasse.compareTo("java.lang.Long") == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean  classeEhArrayLong(Class classe)
	{
		Class tipoDoArray = classe.getComponentType();
		if(tipoDoArray != null)
		{
			//eh array mesmo!!
			if (long.class.isAssignableFrom(tipoDoArray)) {
	            return true;
	        }
		}
		
		return false;
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean classeEhBoolean(Class classe)
	{
		String nomeClasse = classe.getName();
		if(nomeClasse.compareTo("boolean") == 0 || nomeClasse.compareTo("java.lang.Boolean") == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	@SuppressWarnings("rawtypes")
	public static boolean  classeEhArrayBoolean(Class classe)
	{
		Class tipoDoArray = classe.getComponentType();
		if(tipoDoArray != null)
		{
			//eh array mesmo!!
			if (boolean.class.isAssignableFrom(tipoDoArray)) {
	            return true;
	        }
		}
		
		return false;
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean classeEhByte(Class classe)
	{
		String nomeClasse = classe.getName();
		if(nomeClasse.compareTo("byte") == 0 || nomeClasse.compareTo("java.lang.Byte") == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	@SuppressWarnings("rawtypes")
	public static boolean  classeEhArrayByte(Class classe)
	{
		Class tipoDoArray = classe.getComponentType();
		if(tipoDoArray != null)
		{
			//eh array mesmo!!
			if (byte.class.isAssignableFrom(tipoDoArray)) {
	            return true;
	        }
		}
		
		return false;
	}
	
	
	@SuppressWarnings("rawtypes")
	public static boolean classeEhShort(Class classe)
	{
		String nomeClasse = classe.getName();
		if(nomeClasse.compareTo("short") == 0 || nomeClasse.compareTo("java.lang.Short") == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean  classeEhArrayShort(Class classe)
	{
		Class tipoDoArray = classe.getComponentType();
		if(tipoDoArray != null)
		{
			//eh array mesmo!!
			if (short.class.isAssignableFrom(tipoDoArray)) {
	            return true;
	        }
		}
		
		return false;
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean classeEhDouble(Class classe)
	{
		String nomeClasse = classe.getName();
		if(nomeClasse.compareTo("double") == 0 || nomeClasse.compareTo("java.lang.Double") == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean  classeEhArrayDouble(Class classe)
	{
		Class tipoDoArray = classe.getComponentType();
		if(tipoDoArray != null)
		{
			//eh array mesmo!!
			if (double.class.isAssignableFrom(tipoDoArray)) {
	            return true;
	        }
		}
		
		return false;
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean classeEhChar(Class classe)
	{
		String nomeClasse = classe.getName();
		if(nomeClasse.compareTo("char") == 0 || nomeClasse.compareTo("java.lang.Character") == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean  classeEhArrayChar(Class classe)
	{
		Class tipoDoArray = classe.getComponentType();
		if(tipoDoArray != null)
		{
			//eh array mesmo!!
			if (char.class.isAssignableFrom(tipoDoArray)) {
	            return true;
	        }
		}
		
		return false;
	}
}
